// 解构赋值其实是一种模式匹配 方便变量赋值 []
// 其实就等同于 let a = arr[0] ...
// let [a, b, c] = [1, 2, 3]
// console.log(a, b, c);

// 当我们数组多了几个值，这种情况依然不影响abc的赋值
// let [a, b, c] = [1, 2, 3, 4, 5]
// console.log(a, b, c);

// 当我们的变量多了几个值 也不会影响前面的赋值 当后面的值不够匹配时 剩下的变量都是undefined
// let [a, b, c, d, e] = [1, 2, 3]
// console.log(a, b, c, d, e);

// 一些特殊格式 根据后面数组的格式进行格式匹配即可 想要几个值 在相应的格式里给几个值就可以 比如说后面我们只想获取一个值 那么就给个c 就可以了
// let [a, b, [c, d, e]] = [1, 2, [3, 4, 5]]
// console.log(a, b, c, d, e);


// 集合解构 ...是一个扩展运算符 后面跟一个变量 这个变量将来是一个数组
// 在当前的这种情况里 a=1 b=2 后面的3，4，5全部赋值给...c c就是一个数组 c=[3,4,5]
// let [a, b, ...c] = [1, 2, 3, 4, 5]
// 如果只有一个值 我们看下打印输出
// let [a, b, ...c] = [1]
// console.log(a, b, c);


// 默认值 如果我们给e一个默认值 当后面的数组没有值能够和e匹配时 也就是说当变量严格等于undefined时 那么e就输出默认值 如果有匹配的值 那么就输出匹配的值
// 如果匹配的值是null或''空字符串 那么它就会输出null或'' 所以说变量严格等于undefined时,默认值才会生效
// let [a, b, c, d, e = 'hello'] = [1, 2, 3, 4, 5]
// console.log(a, b, c, d, e);

// 默认值为函数时
function test() {
  console.log('hello')
  return 2
}

// let [a = test] = [1] //默认值是test函数 因为有值匹配 所以输出是1
// let [a = test] = [] //默认值是test函数 因为没有匹配值 所以显示默认值，输出是test函数
// let [a = test()] = [] //默认值是执行test函数的结果 因为没有匹配值 所以显示默认值，输出是hello和2
let [a = test()] = [1] //默认值是执行test函数的结果 因为有匹配值 所以输出是1 函数也不会执行(只有当默认值生效时 函数才会执行)

console.log(a);